#!/usr/bin/env python
#coding:utf-8
#test platform:windows7+python3.2
#从nmc网站获取天气预报

import sys,time
import urllib.request
from bs4 import BeautifulSoup

def savetofile(vfilename, vstring):
    '''
    desc:调试时使用，获取到的页面源代码写入本地文件
    '''
    fh=open(vfilename, 'w')
    fh.write(vstring)
    fh.close()
def loadfromfile(vfilename):
    '''
    desc:调试时使用，从本地文件读取获取到的页面源代码
    '''
    fh=open(vfilename, 'r')
    vstring=fh.read()
    fh.close()
    return vstring

def getforecast(vcityname):
    url=r'http://www.nmc.gov.cn/publish/forecast/AZJ/' + vcityname + '.html'
    res=urllib.request.urlopen(url).read()
    #for debug
    #savetofile('../data/nmc.html', res.decode('gbk'))
    #return 0
    #res=loadfromfile('../data/nmc.html')

    soup=BeautifulSoup(res)
    alldatas=soup.findAll('div',attrs={"class":"weather_div"})
    if len(alldatas)<=0:
        info='not found forecast data.\n'
        sys.stdout.write(info)
        return -1

    #保存从网页获取到的未来一周的天气预报数据的列表
    rows=[]
    #取前7条记录就可以了，是未来一周的天气预报数据
    for i in range(0,7):
        try:
            eachday=alldatas[i]
        except Exception as ex:
            info='get forecast data exception:' + str(ex) + '\n'
            sys.stdout.write(info)
            break
        #临时保存获取到的某一天的天气预报数据
        row=[]
        #取日期
        soupdate=BeautifulSoup(str(eachday)).findAll('div', attrs={"class":"name"})
        vdate=(str(time.localtime().tm_year) + str(soupdate[0].getText())[:-3])
        date=time.strptime(vdate, '%Y%m月%d日')
        date=time.strftime('%Y%m%d', date)
        row.append(date)

        soupweather=BeautifulSoup(str(eachday)).findAll('div',attrs={"class":"weather"})
        lis=BeautifulSoup(str(soupweather[0])).findAll('li')
        #这里为了省事，不逐个判断特定属性来取数据了。有点投机取巧，如果数据排列发生变化可能会取错数据。
        if len(lis)<=5:
            idxlist=[0, 2, 3, 4]
        else:
            idxlist=[0, 2, 3, 4, 5, 7, 8, 9]
        for idx in idxlist:
            data=lis[idx].getText()
            row.append(data)
        if len(lis)<=5:
            row.extend(['','','',''])
        rows.append(row)

    #调试时显示获取到的数据
    for it in rows:
        info='|'.join(it)
        sys.stdout.write(info+'\n')

    #返回获取到的未来一周的天气预报数据列表，每个列表元素是一天的天气情况，格式如下：
    #20120306|夜晚|低温5℃|中雨|东北风微风||||
    #20120307|白天|高温7℃ |中雨|东北风微风|夜晚|低温5℃|中雨|东北风微风
    return rows


if __name__=='__main__':
    getforecast('hangzhou')
    print('done')
